package net.demilich.metastone.game.cards; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Predicate; public class CardCollection implements Iterable<Card>, Cloneable { private List<Card> cards = new ArrayList<Card>(); public CardCollection() { } public void add(Card card) { cards.add(card); } public void addAll(CardCollection cardCollection) { for (Card card : cardCollection) { cards.add(card.clone()); } } public void addRandomly(Card card) { int index = ThreadLocalRandom.current().nextInt(cards.size() + 1); cards.add(index, card); } public CardCollection clone() { CardCollection clone = new CardCollection(); for (Card card : cards) { clone.add(card.clone()); } return clone; } public boolean contains(Card card) { return cards.contains(card); } public boolean containsCard(Card card) { if (card == null) { return false; } for (Card other : cards) { if (other.getCardId().equals(card.getCardId())) { return true; } } return false; } public Card get(int index) { return cards.get(index); } public int getCount() { return cards.size(); } public Card getRandom() { if (cards.isEmpty()) { return null; } return cards.get(ThreadLocalRandom.current().nextInt(cards.size())); } public Card getRandomOfType(CardType cardType) { List<Card> relevantCards = new ArrayList<>(); for (Card card : cards) { if (card.getCardType().isCardType(cardType)) { relevantCards.add(card); } } if (relevantCards.isEmpty()) { return null; } return relevantCards.get(ThreadLocalRandom.current().nextInt(relevantCards.size())); } public boolean hasCardOfType(CardType cardType) { for (Card card : cards) { if (card.getCardType().isCardType(cardType)) { return true; } } return false; } public boolean isEmpty() { return cards.isEmpty(); } @Override public Iterator<Card> iterator() { return cards.iterator(); } public Card peekFirst() { return cards.get(0); } public boolean remove(Card card) { return cards.remove(card); } public void removeAll() { cards.clear(); } public void removeAll(Predicate<Card> filter) { cards.removeIf(filter); } public Card removeFirst() { return cards.remove(0); } public boolean replace(Card oldCard, Card newCard) { int index = cards.indexOf(oldCard); if (index != -1) { cards.set(index, newCard); return true; } return false; } public void shuffle() { Collections.shuffle(cards); } public void sortByManaCost() { Comparator<Card> manaComparator = new Comparator<Card>() { @Override public int compare(Card card1, Card card2) { Integer manaCost1 = card1.getBaseManaCost(); Integer manaCost2 = card2.getBaseManaCost(); return manaCost1.compareTo(manaCost2); } }; cards.sort(manaComparator); } public void sortByName() { cards.sort((card1, card2) -> card1.getName().compareTo(card2.getName())); } public List<Card> toList() { return new ArrayList<>(cards); } }